﻿using System;
using System.Collections.Generic;
using System.Text;

namespace Mine
{
    class LockedStation:SimpleStation
    {

        private object locker = new object();
        //mindig a kisebb ID-jű lockolódik első körben
        public override double MoveStones(int Amount, IStation Destination)
        {
            if (this.ID < Destination.ID)//nagyobb ID-jű
            {
                //a -1 es szorzó azért szükséges, hogy a megfelelő irányban mozogjon a kő
                return LockThisFirst((-1) * Amount, (LockedStation)Destination);
            }
            else
            {
                //a destination lock-this-first-je
                return ((LockedStation)Destination).LockThisFirst(Amount, this);
            }
        }

        //ez a függvény lezárja a kissebb ID-jű Stationt
        //a paraméterben szereplő station a nagyobb ID-jű
        public double LockThisFirst(int Amount, LockedStation station)
        {
            lock (locker)//lezárjuk az objektumot
            {
                return station.LockAfterFirst(Amount, this);
            }
        }

        //ez a függvény lezárja a nagyobb ID-jű Stationt
        //a paraméterben szereplő station a kisebb ID-jű
        public double LockAfterFirst(int Amount, LockedStation station)
        {
            lock (locker)//lezárjuk az objektumot
            {
                //az ősoztály metódusát meghivjuk és itt történik a tényleges munka
                return base.MoveStones(Amount, station);//a nagyobb ID-jű moveStones-a fut le
            }
        }
    }
}
